package view.usuarios;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.util.Properties;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import model.Instructor;
import model.PersonalAdministrativo;
import model.Usuario;
import model.comunication.IInstructor;
import model.comunication.IPersonalAdministrativo;
import model.comunication.IUsuario;
import view.ventanas_principales.PrincipalEmpleado;
import view.ventanas_principales.PrincipalInstructor;
import view.ventanas_principales.PrincipalSupervisor;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class Login {

	private JFrame frmLogin;
	private JTextField textNombre;
	private JPasswordField passwordField;
	private JButton btnLogin;
	private IUsuario cmmUsuario;
	private IPersonalAdministrativo cmmPersonalAdministrativo;
	private IInstructor cmmInstructor;
	private JLabel lblUsuarioOContrasea;
	private JLabel lblUsuarioDadoBaja;
	private JLabel lblCampoVacios;
	private JLabel label;
	private Properties properties;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Login window = new Login();
					window.frmLogin.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Login() {

		try {
			properties = new Properties();
			properties.load(new FileInputStream(Login.class.getResource("/properties/users.properties").getFile()));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		cmmInstructor = IInstructor.getInstance();
		cmmPersonalAdministrativo = IPersonalAdministrativo.getInstance();
		cmmUsuario = IUsuario.getInstance();
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frmLogin = new JFrame();
		frmLogin.setIconImage(Toolkit.getDefaultToolkit().getImage(Login.class.getResource("/Icon_/Terminate.gif")));
		frmLogin.setResizable(false);
		frmLogin.getContentPane().setForeground(Color.DARK_GRAY);
		frmLogin.setTitle("Login");
		frmLogin.setBounds(100, 100, 425, 240);
		frmLogin.setLocationRelativeTo(null);
		frmLogin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmLogin.getContentPane().setLayout(null);

		JLabel lblNombre = new JLabel("User Name:");
		lblNombre.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblNombre.setBounds(35, 31, 80, 14);
		frmLogin.getContentPane().add(lblNombre);

		JLabel lblNewLabel = new JLabel("Password:");
		lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblNewLabel.setBounds(35, 77, 95, 14);
		frmLogin.getContentPane().add(lblNewLabel);

		textNombre = new JTextField();
		textNombre.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				// Se asegura de capturar la tecla enter y descartar todas las demas
				char teclaPresionada = e.getKeyChar();

				// Da click al boton login al detectar la tecla enter
				if (teclaPresionada == KeyEvent.VK_ENTER) {
					btnLogin.doClick();
				}
			}
		});
		textNombre.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				lblUsuarioOContrasea.setVisible(false);
				lblUsuarioDadoBaja.setVisible(false);
				lblCampoVacios.setVisible(false);
			}
		});
		textNombre.setBounds(122, 28, 140, 25);
		frmLogin.getContentPane().add(textNombre);
		textNombre.setColumns(10);

		passwordField = new JPasswordField();
		passwordField.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				// Se asegura de capturar la tecla enter y descartar todas las demas
				char teclaPresionada = e.getKeyChar();

				// Da click al boton login al detectar la tecla enter
				if (teclaPresionada == KeyEvent.VK_ENTER) {
					btnLogin.doClick();
				}

			}
		});
		passwordField.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				lblUsuarioOContrasea.setVisible(false);
				lblUsuarioDadoBaja.setVisible(false);
				lblCampoVacios.setVisible(false);
			}
		});
		passwordField.setBounds(122, 74, 140, 25);
		frmLogin.getContentPane().add(passwordField);

		btnLogin = new JButton("Login");
		btnLogin.setFont(new Font("Tahoma", Font.BOLD, 11));
		btnLogin.setBounds(137, 167, 135, 30);
		btnLogin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String nombreUsuario = textNombre.getText();
				@SuppressWarnings("deprecation")
				String password = passwordField.getText();

				if (estaVacio(nombreUsuario) && estaVacio(nombreUsuario)) {
					Usuario usuario = null;
					usuario = cmmUsuario.findUsuario(nombreUsuario, password);

					if (!esNulo(usuario)) {
						if (usuario.getPermisos().equals("Personal Admin")) {
							PersonalAdministrativo personalAdministrativo = cmmPersonalAdministrativo.find(usuario.getId());

							if (personalAdministrativo.getEliminado().equals("no")) {
								try {
									@SuppressWarnings("unused")
									PrincipalEmpleado princAdmin = new PrincipalEmpleado(personalAdministrativo);
								} catch (ParseException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
								frmLogin.dispose();

							} else {
								lblUsuarioDadoBaja.setVisible(true);
							}

						} else if (usuario.getPermisos().equals("Supervisor")) {
							PersonalAdministrativo personalAdministrativo = cmmPersonalAdministrativo.find(usuario.getId());

							@SuppressWarnings("unused")
							PrincipalSupervisor princSupervisor;
							if (personalAdministrativo.getEliminado().equals("no")) {
								try {
									princSupervisor = new PrincipalSupervisor(personalAdministrativo);
								} catch (ParseException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
								frmLogin.dispose();

							} else {
								lblUsuarioDadoBaja.setVisible(true);
							}
						} else if (usuario.getPermisos().equals("Instructor")) {
							Instructor instructor = cmmInstructor.findInstructor(usuario.getId());

							@SuppressWarnings("unused")
							PrincipalInstructor princInstructor;
							if (instructor.getEliminado().equals("no")) {
								princInstructor = new PrincipalInstructor(instructor);
								frmLogin.dispose();

							} else {
								lblUsuarioDadoBaja.setVisible(true);
							}
						}
					} else
						lblUsuarioOContrasea.setVisible(true);

				} else {
					lblCampoVacios.setVisible(true);
				}

			}
		});
		frmLogin.getContentPane().add(btnLogin);

		lblUsuarioOContrasea = new JLabel("Usuario o contrase\u00F1a invalida");
		lblUsuarioOContrasea.setVisible(false);
		lblUsuarioOContrasea.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblUsuarioOContrasea.setForeground(Color.RED);
		lblUsuarioOContrasea.setBounds(35, 124, 186, 14);
		frmLogin.getContentPane().add(lblUsuarioOContrasea);

		lblUsuarioDadoBaja = new JLabel("Usuario dado de baja");
		lblUsuarioDadoBaja.setVisible(false);
		lblUsuarioDadoBaja.setForeground(Color.RED);
		lblUsuarioDadoBaja.setBounds(35, 124, 185, 14);
		frmLogin.getContentPane().add(lblUsuarioDadoBaja);

		lblCampoVacios = new JLabel("Campo/s vacio/s");
		lblCampoVacios.setVisible(false);
		lblCampoVacios.setForeground(Color.RED);
		lblCampoVacios.setBounds(35, 124, 139, 14);
		frmLogin.getContentPane().add(lblCampoVacios);

		label = new JLabel("");
		label.setIcon(new ImageIcon(Login.class.getResource("/Icon_/login_icon_2.png")));
		label.setFont(new Font("Tahoma", Font.BOLD, 11));
		label.setBounds(281, 31, 113, 144);
		frmLogin.getContentPane().add(label);

		String value = (String) properties.get("elrata5");
		if (value != null && !("".equals(value))) {
			this.textNombre.setText("elrata5");
			passwordField.setText(value);
		}
	}

	public boolean estaVacio(String valor) {

		if (valor != null && !valor.equals("")) {
			return true;

		}

		return false;

	}

	public boolean esNulo(Usuario u) {

		if (u.getName() != null && u.getPassword() != null && u.getPermisos() != null && u.getId() != null) {
			return false;

		}

		return true;

	}
}
